#ifndef UTILS_H
#define UTILS_H
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>
#include <sys/time.h>
#include <time.h>
#include <sstream>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include "FileOperate.h"
#include "Encrypt.h"
#include "Utils_global.h"

class UTILS_EXPORT Utils
{
private:
    Utils();

public://uuid
    static std::string createUUID();

public://time
    /**
     * @brief 开始计时
     */
    static void startTick();
    /**
     * @brief 停止计时
     * @return 返回从开始计时到停止计时的秒数，精确到微秒
     */
    static double stopTick();
    /**
     * @brief 获取当前日期
     * @return 当前日期（格式：yyyy-MM-dd）
     */
    static std::string getCurrentData();
    /**
     * @brief 获取当前时间
     * @return 当前时间（格式：hh:mm:ss）
     */
    static std::string getCurrentTime();
    /**
     * @brief 获取当前日期
     * @return 当前日期（格式：yyyy-MM-dd hh:mm:ss）
     */
    static std::string getCurrentDateTime();
    /**
     * @brief 获取1970年1月1日0点0分0秒到现在的秒数
     * @return 总秒数
     */
    static unsigned long getTotalSecondScenceEporch();

public://std::string
    /**
     * @brief 删除字符串开头和结尾的空格
     * @param 要修改的字符串
     */
    static void trimString(std::string& src);
    /**
     * @brief 获取字符串中特定子字符串的个数
     * @param src 源字符串
     * @param sep 要查找的字符串
     * @return 查找到的个数
     */
    static int  getSubStringCount(const std::string& src,const std::string& sep);
    /**
     * @brief 分割字符串
     * @param src 源字符串
     * @param sep 分割符号
     * @param result 分割后的结果
     */
    static void splitString(const std::string& src, const std::string& sep, std::vector<std::string>& result);
    /**
     * @brief 将字符串中的所有英文字符转小写
     * @param src源字符串
     * @param result 转换结果
     */
    static void lowerCaseString(const std::string& src, std::string& result);
    /**
     * @brief 将字符串中的所有英文字符转大写
     * @param src源字符串
     * @param result 转换结果
     */
    static void upperCaseString(const std::string& src, std::string& result);
    /**
     * @brief 对源字符串中的特定字符串更改为指定的新字符串
     * @param src 源字符串
     * @param _olds 指要转化的定字符串
     * @param _news 目标字符串
     * @param count 替换个数（-1代表全部）
     */
    static void replaceString(std::string& src, const std::string& _olds, const std::string& _news, int count = -1);
    /**
     * @brief 判断源字符串是否以指定字符串开头
     * @param src 源字符串
     * @param head 要判断的头字符串
     * @return 判断结果
     */
    static bool startWithString(const std::string& src, const std::string& head);
    /**
     * @brief 判断源字符串是否以指定字符串结尾
     * @param src 源字符串
     * @param tail 要判断的尾字符串
     * @return 判断结果
     */
    static bool endWithString(const std::string& src, const std::string& tail);

public://MAC IP
    /**
     * @brief getMacIP 获取MAC 和 IP
     * @param _devNameList 网口名称列表
     * @param _macList MAC地址列表
     * @param _ipList IP 地址列表
     */
    static void getMacIP(std::vector<std::string>& _devNameList, std::vector<std::string>& _macList, std::vector<std::string>& _ipList);

public://license 授权工具
    /**
     * @brief create_cert 创建数字证书
     * @param file
     * @return
     */
    static bool create_cert(std::string file);
    /**
     * @brief check_cert 检查数字证书有效性
     * @param file
     * @return
     */
    static bool check_cert(std::string file);
    /**
     * @brief create_license 根据数字证书创建license
     * @param file_cert
     * @param file_license
     * @return
     */
    static bool create_license(const std::string file_cert,std::string file_license);
    /**
     * @brief check_license 验证数字证书和license
     * @param file_cert
     * @param file_license
     * @return
     */
    static bool check_license(std::string file_cert,std::string file_license);


};


#endif // UTILS_H
